

package classloading;

import java.util.Random;

/**
 * This is a demo application which can cause a classloader leakage via {@link ThreadLocal}.
 * <p>
 * It is adapted from original Hazelcast code which created a {@link ThreadLocal} leakage.
 */
public final class LeakingApplication {

    private LeakingApplication() {
    }

    public static void init(Boolean doCleanup) {
        ThreadLocalRandom.LOCAL_RANDOM.get();
        if (doCleanup) {
            cleanup();
        }
    }

    public static void cleanup() {
        ThreadLocalRandom.LOCAL_RANDOM.remove();
    }

    private static class ThreadLocalRandom extends Random {

        /**
         * This causes a classloader leakage which may produce errors in web containers or
         * even cause a PermGen Space OOME in Java 6 (since references are not cleaned up).
         * <p>
         * Never override {@link ThreadLocal#initialValue()} in production code!
         */
        private static final ThreadLocal<ThreadLocalRandom> LOCAL_RANDOM = ThreadLocal.withInitial(ThreadLocalRandom::new);
    }
}
